
#include "BaseTypesWrappers.h"

// ============================================================================

bool UInt32HexTypeConverter::CanConvertFrom (ITypeDescriptorContext^ context, Type^ sourceType)
{
	if (sourceType == String::Empty->GetType ())
		return true;
	else
		return TypeConverter::CanConvertFrom (context, sourceType);
}

// ============================================================================

bool UInt32HexTypeConverter::CanConvertTo (ITypeDescriptorContext^ context, Type^ destinationType)
{
	if (destinationType == String::Empty->GetType ())
	{
		return true;
	}
	else
	{
		return TypeConverter::CanConvertTo(context, destinationType);
	}
}

// ============================================================================

Object^ UInt32HexTypeConverter::ConvertTo (ITypeDescriptorContext^ context, CultureInfo^ culture, Object^ value, Type^ destinationType)
{
	if (destinationType == String::Empty->GetType () && value->GetType() == UInt32::typeid)
	{
		return String::Format ("0x{0:X8}", value);
	}
	else
	{
		return TypeConverter::ConvertTo (context, culture, value, destinationType);
	}
}

// ============================================================================

Object^ UInt32HexTypeConverter::ConvertFrom (ITypeDescriptorContext^ context, CultureInfo^ culture, Object^ value)
{
	if (value->GetType () == String::Empty->GetType ())
	{
		String^ input = (String^) value;

		if (input->StartsWith ("0x", StringComparison::OrdinalIgnoreCase))
		{
			input = input->Substring (2);
		}

		return UInt32::Parse (input, NumberStyles::HexNumber, culture);
	}
	else
	{
		return TypeConverter::ConvertFrom (context, culture, value);
	}
}

// ============================================================================
// ============================================================================

bool UInt16HexTypeConverter::CanConvertFrom (ITypeDescriptorContext^ context, Type^ sourceType)
{
	if (sourceType == String::Empty->GetType ())
		return true;
	else
		return TypeConverter::CanConvertFrom (context, sourceType);
}

// ============================================================================

bool UInt16HexTypeConverter::CanConvertTo (ITypeDescriptorContext^ context, Type^ destinationType)
{
	if (destinationType == String::Empty->GetType ())
	{
		return true;
	}
	else
	{
		return TypeConverter::CanConvertTo(context, destinationType);
	}
}

// ============================================================================

Object^ UInt16HexTypeConverter::ConvertTo (ITypeDescriptorContext^ context, CultureInfo^ culture, Object^ value, Type^ destinationType)
{
	if (destinationType == String::Empty->GetType () && value->GetType() == UInt16::typeid)
	{
		return String::Format ("0x{0:X4}", value);
	}
	else
	{
		return TypeConverter::ConvertTo (context, culture, value, destinationType);
	}
}

// ============================================================================

Object^ UInt16HexTypeConverter::ConvertFrom (ITypeDescriptorContext^ context, CultureInfo^ culture, Object^ value)
{
	if (value->GetType () == String::Empty->GetType ())
	{
		String^ input = (String^) value;

		if (input->StartsWith ("0x", StringComparison::OrdinalIgnoreCase))
		{
			input = input->Substring (2);
		}

		return UInt16::Parse (input, NumberStyles::HexNumber, culture);
	}
	else
	{
		return TypeConverter::ConvertFrom (context, culture, value);
	}
}

// ============================================================================
// ============================================================================

bool UInt8HexTypeConverter::CanConvertFrom (ITypeDescriptorContext^ context, Type^ sourceType)
{
	if (sourceType == String::Empty->GetType ())
		return true;
	else
		return TypeConverter::CanConvertFrom (context, sourceType);
}

// ============================================================================

bool UInt8HexTypeConverter::CanConvertTo (ITypeDescriptorContext^ context, Type^ destinationType)
{
	if (destinationType == String::Empty->GetType ())
	{
		return true;
	}
	else
	{
		return TypeConverter::CanConvertTo(context, destinationType);
	}
}

// ============================================================================

Object^ UInt8HexTypeConverter::ConvertTo (ITypeDescriptorContext^ context, CultureInfo^ culture, Object^ value, Type^ destinationType)
{
	if (destinationType == String::Empty->GetType () && value->GetType() == Byte::typeid)
	{
		return String::Format ("0x{0:X2}", value);
	}
	else
	{
		return TypeConverter::ConvertTo (context, culture, value, destinationType);
	}
}

// ============================================================================

Object^ UInt8HexTypeConverter::ConvertFrom (ITypeDescriptorContext^ context, CultureInfo^ culture, Object^ value)
{
	if (value->GetType () == String::Empty->GetType ())
	{
		String^ input = (String^) value;

		if (input->StartsWith ("0x", StringComparison::OrdinalIgnoreCase))
		{
			input = input->Substring (2);
		}

		return Byte::Parse (input, NumberStyles::HexNumber, culture);
	}
	else
	{
		return TypeConverter::ConvertFrom (context, culture, value);
	}
}

// ============================================================================
// ============================================================================

bool BridgeIdConverter::CanConvertTo (ITypeDescriptorContext^ context, Type^ destinationType)
{
	if (destinationType == BridgeId::typeid)
		return true;

	return ExpandableObjectConverter::CanConvertTo (context, destinationType);
}

// ============================================================================

Object^ BridgeIdConverter::ConvertTo (ITypeDescriptorContext^ context, CultureInfo^ culture, Object^ value, Type^ destinationType)
{
	if (destinationType == String::typeid && value->GetType () == BridgeId::typeid)
		return BRIDGE_ID_ToString (((BridgeId^) value)->bridgeId);
	else
		return ExpandableObjectConverter::ConvertTo (context, culture, value, destinationType);
}

// ============================================================================
